package com.sunday.common.http.apache.impl;

import org.apache.hc.core5.annotation.Contract;
import org.apache.hc.core5.annotation.ThreadingBehavior;
import org.apache.hc.core5.http.HttpResponse;
import org.apache.hc.core5.http.protocol.HttpContext;
import org.apache.hc.core5.util.TimeValue;

/**
 * 自定义的保持连接活跃策略
 *
 * @author zsy
 * @see org.apache.hc.client5.http.impl.DefaultConnectionKeepAliveStrategy
 * @since 2024/1/18
 */
@Contract(threading = ThreadingBehavior.STATELESS)
public class DefaultConnectionKeepAliveStrategy extends org.apache.hc.client5.http.impl.DefaultConnectionKeepAliveStrategy {

    /**
     * httClient就会利用这个它。如果头部信息Keep-Alive在响应中不存在，HttpClient假设连接无限期的保持活动
     * 现在默认拒绝永久连接 60000
     */
    private final static long KEEP_ALIVE_MS = 60000;

    public static final DefaultConnectionKeepAliveStrategy INSTANCE = new DefaultConnectionKeepAliveStrategy();

    /**
     * HTTP规范没有确定一个持久连接可能或应该保持活动多长时间。一些HTTP服务器使用非标准的头部信息Keep-Alive来告诉客户端它们想在服务器端保持连接活动的周期秒数。
     * 如果这个信息可用，HttClient就会利用这个它。如果头部信息Keep-Alive在响应中不存在，HttpClient假设连接无限期的保持活动。
     * 然而许多现实中的HTTP服务器配置了在特定不活动周期之后丢掉持久连接来保存系统资源，往往这是不通知客户端的。
     */
    @Override
    public TimeValue getKeepAliveDuration(final HttpResponse response, final HttpContext context) {
        // 默认的话，是从response里头读timeout参数的，没有读到则设置为-1，这个代表无穷，这样设置是有点问题了，如果是https链接的话，则可能会经常报
        TimeValue timeValue = super.getKeepAliveDuration(response, context);
        if (timeValue.getDuration() == -1) {
            return TimeValue.ofMilliseconds(KEEP_ALIVE_MS);
        }
        return timeValue;
    }


}
